package com.demo.ReentrantLock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 重入锁：可以重复进入的锁
 * 当一个线程获得锁后，若还需再一次获得该锁，那么就第二次就无需获得，直接拥有该锁
 * 解决一个线程重复获得同一把锁时引发的死锁问题
 * 下面演示死锁问题，知晓为什么要引入重入锁
 */
public class Demo01 {

    //当调用a()方法时，会获得Demo01的实例锁，在a（）方法中，执行b（）方法，又会再一次
    synchronized void a(){//1.获得Demo01的锁
        b();//2执行b方法
    }

    void b(){
        synchronized (this){//3.获取Demo01的锁，但由于该锁还未被释放，则进入阻塞状态，a()和b()都在等待对象释放锁，故造成了死锁现象
            int a=1   ;
        }
    }

    //用重入锁解决该现象

    static Lock lock = new ReentrantLock();
    void test(){
        c();
    }

    void c(){//1.获得Demo01的锁
        lock.lock();
        int  a=1;
        System.out.println(a);
        c();//2执行b方法
        lock.unlock();
    }

    void d(){
        lock.lock();
        int b=1   ;
        System.out.println(b);
        lock.unlock();
    }

    public static void main(String[] args) {
        Demo01 d= new Demo01();
        d.test();
    }

}
